#include "game1.h"

//游戏进行
int game_set = 1;

//方块边框宽度，内部宽度
int out_width = 1;
int in_width = 112;
//7*114 = 798

lv_obj_t *block_objs[4][7];

//方块速度
int block_speed = 15;
//方块移动范围
int block_area;
//方块计数
int block_cnt;
//失败判断
int block_fail = 0;

lv_timer_t *block_move_timer = NULL;
lv_timer_t *game_check_timer = NULL;
static const uint32_t color_values[7] = {
    hong, cheng, huang, lv, qing, lan, zi
};

// 方块颜色数组（在运行时初始化）
lv_color_t colors[7];

// 黑色和白色常量
static lv_color_t COLOR_BLACK;
static lv_color_t COLOR_WHITE;

// 初始化颜色
static void init_colors(void)
{
    COLOR_BLACK = lv_color_hex(hei);
    COLOR_WHITE = lv_color_hex(bai);
    
    for(int i = 0; i < 7; i++) {
        colors[i] = lv_color_hex(color_values[i]);
    }
}

// 比较两个颜色是否相等
static bool colors_equal(lv_color_t c1, lv_color_t c2)
{
    return lv_color_to32(c1) == lv_color_to32(c2);
}



// 方块点击事件处理函数
static void block_click_event(lv_event_t *e)
{
    lv_obj_t *obj = lv_event_get_target(e);
    if(obj) {
        // 检查方块是否为黑色
        if(colors_equal(lv_obj_get_style_bg_color(obj, 0), COLOR_BLACK)) {
            // 变为白色
            lv_obj_set_style_bg_color(obj, COLOR_WHITE, 0);
            block_cnt++;
            printf("得分:%d\n", block_cnt);
            printf("速度:%d\n", block_speed);
            
            // 每10分增加一次速度
            if(block_cnt > 0 && block_cnt%5 == 0) {
                block_speed++;
                if(block_speed >= 100) {
                    block_speed = 100;
                }
            }
        }
		else
		{
			block_fail=1;
		}
    }
}

// 创建游戏界面
void create_game_ui(void)
{
    // 初始化颜色（如果还没有初始化）
    static bool colors_initialized = false;
    if(!colors_initialized) {
        init_colors();
        colors_initialized = true;
    }
    
    // 清空屏幕
    lv_obj_clean(lv_scr_act());
    
    // 创建4x7的方块网格
    for(int y = 0; y < 4; y++) {
        for(int x = 0; x < 7; x++) {
            // 创建方块对象
            block_objs[y][x] = lv_obj_create(lv_scr_act());
            lv_obj_set_size(block_objs[y][x], 112, 112);
            lv_obj_set_pos(block_objs[y][x], x * 114, y * 119);
            
            // 设置样式
            lv_obj_set_style_bg_color(block_objs[y][x], COLOR_WHITE, 0);
            lv_obj_set_style_border_width(block_objs[y][x], 1, 0);
            lv_obj_set_style_border_color(block_objs[y][x], COLOR_BLACK, 0);
            
            // 添加点击事件
            lv_obj_add_event_cb(block_objs[y][x], block_click_event, LV_EVENT_CLICKED, NULL);
            lv_obj_add_flag(block_objs[y][x], LV_OBJ_FLAG_CLICKABLE);
        }
    }
}

// 方块移动回调函数
void block_move_cb(lv_timer_t *timer)
{
    static int block_area = 0;
    
    if(block_fail) {
        lv_timer_del(block_move_timer);
        block_move_timer = NULL;
        return;
    }
    
    // 移动方块
    for(int y = 0; y < 4; y++) {
        for(int x = 0; x < 7; x++) {
            // 获取当前位置
            lv_coord_t cur_x = lv_obj_get_x(block_objs[y][x]);
            cur_x += block_speed;
            
            // 方块坐标超出屏幕右边，重置方块位置到左边
            if(cur_x >= 798) {
                if(colors_equal(lv_obj_get_style_bg_color(block_objs[y][x], 0), COLOR_BLACK)) {
                    block_fail = 1;
                    return;
                }
                lv_obj_set_style_bg_color(block_objs[y][x], COLOR_WHITE, 0);
                cur_x -= 798;
            }
            
            // 设置新位置
            lv_obj_set_x(block_objs[y][x], cur_x);
        }
    }
    
    block_area += block_speed;
    
    // 随机创建黑色方块
    if(block_area > 114) {
        block_area = 0;
        
        // 随机选择一行
        int random_y = rand() % 4;
        
        // 在该行最左边创建黑色方块
        for(int x = 0; x < 7; x++) {
            if(lv_obj_get_x(block_objs[random_y][x]) >= 0 && 
               lv_obj_get_x(block_objs[random_y][x]) < 114) {
                lv_obj_set_style_bg_color(block_objs[random_y][x], COLOR_BLACK, 0);
                break;
            }
        }
    }
}

// 游戏检查回调函数
void game_check_cb(lv_timer_t * timer)
{
    if(block_fail) {

        // 删除计时器
        if(block_move_timer) {
            lv_timer_del(block_move_timer);
            block_move_timer = NULL;
        }
        
        lv_timer_del(game_check_timer);
        game_check_timer = NULL;
        
        // 显示游戏结束界面
        game_over_ui();
    }
}

// 游戏结束界面
void game_over_ui(void)
{
    // 清空屏幕
    lv_obj_clean(lv_scr_act());
    
    // 创建一个标签显示分数
    lv_obj_t * main_window = lv_obj_create(NULL);

	lv_obj_t * img = lv_img_create(main_window);
	lv_img_set_src(img, "S:/bmp/game_end.png");
	lv_obj_set_size(img, 800, 480);
	lv_obj_align(img,LV_ALIGN_TOP_LEFT,0,0);

	lv_obj_t *label = lv_label_create(main_window);
    char score_str[20];	
    sprintf(score_str, "Your score is %d", block_cnt);
    lv_label_set_text(label, score_str);
	lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0); 
	lv_obj_set_style_text_color(label, lv_color_hex(0xffffff), 0); 
    lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0);
    
    // 创建一个关闭按钮
    lv_obj_t * close_btn = lv_btn_create(main_window);
    lv_obj_set_size(close_btn, 50, 50);
	lv_obj_set_style_bg_color(close_btn, lv_color_hex(0xff0000), 0);
    lv_obj_align(close_btn, LV_ALIGN_TOP_RIGHT, -10, 10);

    lv_obj_t * btn_label = lv_label_create(close_btn);
    lv_label_set_text(btn_label, LV_SYMBOL_CLOSE);
    lv_obj_set_style_text_color(btn_label, lv_color_hex(0xffffff), 0);
    lv_obj_center(btn_label);

	lv_obj_add_event_cb(close_btn, game_event, LV_EVENT_SHORT_CLICKED, NULL);

	lv_scr_load(main_window);
}
